﻿
#include <ctime>
#include <iostream>
#include <array>
#include <vector>
#include <map>
#include <functional>

/**
 * std::mem_fn定位class中的函数或者成员
 */
using namespace std;

template<typename T>
class Makefinal {
    friend T;

private:
    Makefinal() {}

    ~Makefinal() {}
};

class FinalClass2 : virtual public Makefinal<FinalClass2> {
public:
    FinalClass2() : m_a{101} {}

    ~FinalClass2() {}

    void func() {
        std::cout << __func__ << std::endl;
    }

    void func1() {
        std::cout << __func__ << std::endl;
    }

    int func1(int a) {
        std::cout << __func__ << "\t" << a << std::endl;
        return ++a;
    }

    int m_a{100};
private:
    int m_b{200};
};

int main(int argc, char const *argv[]) {
    // 定义函数指针，因为有重载的函数
    void (FinalClass2::* func1)(void) = &FinalClass2::func1;
    int (FinalClass2::* func2)(int) = &FinalClass2::func1;

    // 通过mem_fn获取类中函数对象
    auto foo = std::mem_fn(&FinalClass2::func);
    auto foo1 = std::mem_fn(func1);
    auto foo2 = std::mem_fn(func2);
    auto foo3 = std::mem_fn(&FinalClass2::m_a);
    // 私有对象无法获取。
    // auto foo4 = std::mem_fn(&FinalClass2::m_b);

    FinalClass2 fc{};
    // 调用
    foo(fc);
    foo1(fc);
    std::cout << foo2(fc, 10) << std::endl;
    std::cout << foo3(fc) << std::endl;

    return 0;
}
